查看原文
其他

想量化人脸上的情绪?课代表工具都帮你准备好了

想喝咖啡的课代表 澎湃美数课 2022-05-01


我们常说,语言会骗人,但表情和肢体动作是骗不了人的。那我们可能量化一个人的面部表情,来做分析吗?

答案是,可以的。

美国数据可视化公司 Periscopic(潜望镜)一个有趣的作品《One Angry Bird:Emotional arcs of the past ten U.S. presidential inaugural address》就是基于人脸识别的情绪分析创作的。


⌂ 点击图片查看大图
https://emotions.periscopic.com/inauguration/


Periscopic 这个作品是就用数据验证了人们的直觉感受——特朗普确实与其他总统不同。他们对 1981 年里根到 2017年 特朗普共 10 届的美国总统就职演讲视频做了面部表情分析,发现奥巴马、布什父子、克林顿和里根都表现得比较积极或冷静,但特朗普就显得异常消极,用他们的话来说,像一只“愤怒的小鸟”。

这个作品用的数据分析方法说到底就是情感分析,只不过大家见得比较多的可能是做文本情感分析的作品。文本情感分析涉及自然语言处理(NLP),主要基于情感词典或机器学习或二者混合的方法工作。而图像情感分析,主要原理是提取人脸特征,并对这些特征进行情感分类,现在的分类训练主要基于深度学习方法。

听着很“高大上”,但我们也不必真的深入了解这些原理。即使我们不是算法工程师,也可以做人脸情绪分析。课代表就尝试了一下 Periscopic 数据说明里提及的 Microsoft Emotion API,复刻了一下特朗普的情绪数据。

✦✧

想分析人脸情绪?会用API就行!


在正式开始之前,课代表先简要介绍一下什么是 API( Application Programming Interface, 应用程序接口)。打个比方,API可以理解为一个插座(专业用语:接口),你要用某样电器(做某个项目)的时候,不用知道电线怎么搭才能通电(学习底层代码),而是插到插座上就能运作(实现某项功能)啦。 
放到这个项目的语境里,就是我们不用学习怎么用代码抓取图像里的人脸以及判定人脸情绪值,只需要输入图片地址,API就会告诉你图片里的人展现了什么情绪
而我们要使用的 API 是微软公用云端服务平台 Microsoft Azure 中认知服务(Cognitive Services)的一项。Azure 允许用户申请一个时限为 12 个月的免费账户,但注册时还是需要挂靠一张信用卡,所以请准备好你的 VISA 或者 MASTER 卡。
创建好账户后,按下图步骤创建人脸识别项目,就可以开始使用 API 。API 控制台页面(STEP 3标记处进入)会详细介绍这个 API 的各个参数,参数的返回示例,以及各种响应错误的情况,相当于一份说明书了,遇到什么问题记得及时查看。


这个API是支持在线使用的,如果你只需要识别少量图片,完全可以在网页上完成。进入到创建项目时选择区域的对应通道后,修改参数,输入图片以 jpg 结尾的url(网址),就可以获得数据,一共是生气、轻蔑、恶心、恐惧、伤心、开心、惊讶和中立8种情绪值


⌂ 点击图片查看大图

好,到这里,恭喜你通关普通难度了,你已经掌握微软人脸情绪分析API的基本使用方法了,能够分析图片的人脸情绪了。但不要忘记,Periscopic 的项目是分析了多个视频,所以课代表还是要带大家走一下困难关卡:写代码调用API,分析视频中人物的情绪变化。 

Microsoft Azure Cognitive Services 其实是给了相关代码的,但这是用 C# 写的,也更强调对实时监控视频的分析。会 C# 的大神朋友可以直接访问他们的Github 借用代码,而不会 C# 的课代表决定根据原理,用更大众的 python 来复刻。

微软该项目的Github地址:

https://github.com/microsoft/Cognitive-Samples-VideoFrameAnalysis


#跳过思路版#

以下教程涉及到的代码,课代表都上传 Github 啦。不会写代码,不想深入了解代码的朋友可以直接借用,找到 “ 需要修改的地方x ” 这样的注释,按照指示修改几处内容就好啦。



第一步:下载好需要分析的视频。
第二步:视频抽帧和剪裁视频。
用 jupyter notebook 打开 video_capture 代码文件,修改视频路径、裁剪保留区域长宽位置和抽帧间隔(共4处)。部分图片还需要使用 Photoshop 进行打码处理。
第三步:调用API批量分析并导出。
打开 send_request 代码文件,修改 api 通道网址、api 密钥、图片 url 和图片张数(共5处)。
第四步:分析数据
在 excel 处理出最终的显要积极消极情绪值,进行可视化。



如果你还想了解一下,复刻思路,可以继续往下看:

#分析思路版#

第一步:下载好需要分析的视频

第二步:视频抽帧和裁剪视频。

这一步的核心思想其实是把视频变为图片。众所周知,视频其实就是由一帧一帧图片构成的,所以只要我们在合理的间隔抽取一帧图片来分析,就能够较有代表性地分析视频啦。(当然,如果足够有钱和有时间的话,每一帧分析也可以……)

那到底怎么确定抽取间隔呢?参考 Periscopic 的相关创作手札,隔半秒抽取一帧是可行的,毕竟一秒内人的表情相对稳定,一秒两帧已有相当的代表性。那么我们就需要计算视频的总帧数,进而计算每秒多少帧,来确定“每隔x秒抽取一帧”的x是多少。最后写一个循环来抽帧就大功告成。

⌂ 抽帧代码截图


当然,在抽帧前后,还有一些细节需要处理。需要根据人物固定所在的位置收窄一下画幅,这通过代码可以批量处理。但还需要检查一下漏网之鱼,用 PS 手动给某些帧里的多余面孔打码。

⌂ 裁剪代码截图


第三步:调用API批量分析并导出。

正式调用 API 之前,记得把所有图片上传到可以产生 jpg 或 png 结尾的 url 的在线网站,例如 Github,并以同样格式序列命名,这样之后才能调用成功。 

用 python 调用 API 做的工作,其实和在网页做的工作是一样的,总结来说,还是要选择通道、确定参数和输入密钥。只是后面需要写一个循环,让代码自动读取图片,以做到批量生产。

⌂ python代码调用API截图


⌂ 批量分析代码截图



这些分析结果是json格式的,为了后续分析方便,需要转为csv格式。

第四步:分析数据和可视化

初次得到csv文件后,打开发现,正如 Periscopic 所说,大多数画面都是中立(neutral)情感为主。所以要考虑保留次要情绪,这样才能明显地看出积极和消极倾向。为了看出主要趋势,课代表简单粗暴地删除了“中立”项来可视化(Periscopic 是保留了的)。

⌂ excel处理情绪值截图


同样,为了简单直观地可视化这个最终的分析结果,课代表没有用 Periscopic用的编程语言 Processing,而是使用了零代码需求的在线可视化工具 Flourish 来制作。虽然简陋,但能看出和 Periscopic 的成品结果是相似的。课代表宣布复刻事业大成功!✌️人脸情绪分析这项技能成功点亮!✨

⌂ 点击图片查看大图


不止微软提供人脸情绪识别的API,其实在国内,旷视和百度也提供相应的API。课代表也做了相应的测试:

旷视的API含七个情绪指标,比微软少了一个“轻蔑(contempt)”,测试结果和微软稍有出入,但依然以消极情绪为主,整体吻合。

⌂ 旷视API测试结果


而百度的API则稍逊一筹,尽管百度包含九个情绪指标(愤怒、厌恶、恐惧、高兴、伤心、惊讶、嘟嘴、鬼脸、无情绪),但 API 只会返回第一位情绪值,还时常出现“无法识别”情况,“嘟嘴”“鬼脸”这两个指标也难以解读。

⌂ 百度API测试结果


✧✦ 

情感分析,yyds?


做完复刻,是不是觉得情感分析是一个很厉害的方法,开启了新世界大门?课代表很能理解这样激动的心情,毕竟我们就是希望机器能帮我们客观地呈现、分析更多缥缈的东西。

我们希望机器能帮我们化繁为简,“把书读薄”,所以让它们做一些高频词统计工作;我们希望机器能帮我们捕捉情绪,了解好恶,所以让它们做一些情感分析工作。 

但愿景虽好,目前技术还是有很大提升空间的。不了解情感分析的局限性,滥用情感分析,很容易生产出不科学的结论。

比如,大家常用的一个文本情感分析 python 工具包 snowNLP ,也有不少“失灵”的时候。snowNLP Github 上的官方源码仓库问题区里就有不少表示“不准”的帖子:

⌂ Github上的问题帖子截图


说实话,想要一个模板走天下是不切实际的,所以使用前需要使用新数据集对程序进行训练,源码仓库里也提供了训练文件。但现实是,很多使用者不进行训练就使用 python 包,这会产生很多虚假的结论;而更可怕的是,读者并不清楚后台的处理过程,很容易轻信这些虚假结论。这会极大损伤新闻的真实性和准确性。 

回到我们复刻项目看,它也不是尽善尽美的。Periscopic 做这个项目的时候,也在末尾写了很长的数据说明,也交代了准确性问题——通过和真实感受比对,确认 API 大体上能反映正确情绪,但也可能对讽刺、自鸣得意等复杂情绪产生误读。而课代表对旷视和百度 API 的测试结果有好有坏,可见同一个分析方法,不同平台的技术支持能力也是有差异的。

所以,我们使用情绪分析时,需要谨慎再谨慎,需要充分检验工具的能力、核查结论的可靠性,这样才能交出“真答案”。

我们无法苛求机器尽善尽美,只能在使用时再三确认,毕竟情感是人独特的存在,正是因为有很多机器“终其一生”都难以参透的微妙之处,才显得弥足珍贵。

公众号后台回复 64,可以获取本文所有编程文件及本文高清大图,跟着课代表一起学习!


作者  邓海滢




◒◡◒

┊推 - 荐 - 阅 - 读┊





您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存